package com.chukun.multi.immutable;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * 不可变的对象
 * 彩信中心路由规则管理器
 */
public final class MMSCRouter {
    //volatile修饰，保证多线程环境下该变量的可见性
    private static volatile MMSCRouter instance = new MMSCRouter();
    //维护手机号码前缀到彩信中心的映射关系
    private final Map<String,MMSCInfo> routerMap;

    public MMSCRouter(){
        //将数据库表中的数据加载带内存中
        this.routerMap = MMSCRouter.retrieveRouteMapFromDB();
    }

    private static Map<String,MMSCInfo> retrieveRouteMapFromDB(){
        Map<String,MMSCInfo> map = new HashMap<>();
        //省略从数据加载数据的代码
        return map;
    }

    public static MMSCRouter getInstance(){
        return instance;
    }

    /**
     * 根据手机号码前缀，获取对应的彩信中心信息
     * @param msisdnPrefix
     * @return
     */
    public MMSCInfo getMMSC(String msisdnPrefix){
        return routerMap.get(msisdnPrefix);
    }

    /**
     * 将当前MMSCRouter实例，更新为新的实例
     * @param newInstance
     */
    public  static  void setInstance(MMSCRouter newInstance){
        instance = newInstance;
    }

    private static Map<String,MMSCInfo> deepCopy(Map<String,MMSCInfo> m){
        Map<String,MMSCInfo> result = new HashMap<>();
        for(String key:m.keySet()){
            result.put(key,new MMSCInfo(m.get(key)));
        }
        return result;
    }

    public  Map<String,MMSCInfo> getRouterMap(){
        //防御性复制
        return Collections.unmodifiableMap(deepCopy(routerMap));
    }

}
